ORACLE - RANK() OVER() / DENSE_RANK() OVER / ROW_NUMBER () OVER() :: 오라클팁[SSISO Community]
 
SSISO 카페 SSISO Source SSISO 구직 SSISO 쇼핑몰 SSISO 맛집
추천검색어 : JUnit   Log4j   ajax   spring   struts   struts-config.xml   Synchronized   책정보   Ajax 마스터하기   우측부분

오라클팁
[1]
등록일:2011-06-20 09:37:27 (0%)
작성자:
제목:ORACLE - RANK() OVER() / DENSE_RANK() OVER / ROW_NUMBER () OVER()

안녕하세요?

오늘은 데이터에 랭킹(RANKING) 을 매기는 SQL문에 대해서 알아보겠습니다.

 

먼저 UNION ALL을 이용하여 가상의 데이터를 만들어 봅시다.

 

    SELECT 1 B, 0 C FROM DUAL
    UNION ALL
    SELECT 5 B, 9 C FROM DUAL
    UNION ALL
    SELECT 4 B, 9 C FROM DUAL
    UNION ALL
    SELECT 3 B, 7 C FROM DUAL
    UNION ALL
    SELECT 2 B, 6 C FROM DUAL
    UNION ALL
    SELECT 4 B, 4 C FROM DUAL
    UNION ALL
    SELECT 1 B, 5 C FROM DUAL
    UNION ALL
    SELECT 2 B, 1 C FROM DUAL

결과

B C

--------------------------------

1 0
5 9
4 9
3 7
2 6
4 4
1 5
2 1


쉽게 결론부터 말하자면

RANK() OVER() 란 특정 컬럼의 값에 순위를 매겨주는 것입니다.

 SELECT C, RANK() OVER(ORDER BY C DESC)
FROM (   
    SELECT 1 B, 0 C FROM DUAL
    UNION ALL
    SELECT 5 B, 9 C FROM DUAL
    UNION ALL
    SELECT 4 B, 9 C FROM DUAL
    UNION ALL
    SELECT 3 B, 7 C FROM DUAL
    UNION ALL
    SELECT 2 B, 6 C FROM DUAL
    UNION ALL
    SELECT 4 B, 4 C FROM DUAL
    UNION ALL
    SELECT 1 B, 5 C FROM DUAL
    UNION ALL
    SELECT 2 B, 1 C FROM DUAL
)

C   RANK()OVER(ORDERBYCDESC)

---------------------------------------------------------

9   1
9   1
7   3
6   4
5   5
4   6
1   7
0   8

 

결과에 보듯이 C컬럼의 값을 DESC로 ORDER BY 하여 순위를 매겨줍니다.

1등, 3등, 4등, 5등, 6등....

아~! 여기서 보니까 공동 1등이 있으니까 2등은 없고 바로 3등으로 넘어가는군요?

그러면 공동 1등이 있고 3등을 2등으로 만들어줄수는 없을까?

 

그게 바로 DENSE_RANK() OVER() 입니다.

 SELECT C, DENSE_RANK() OVER(ORDER BY C DESC) 
FROM (   
    SELECT 1 B, 0 C FROM DUAL
    UNION ALL
    SELECT 5 B, 9 C FROM DUAL
    UNION ALL
    SELECT 4 B, 9 C FROM DUAL
    UNION ALL
    SELECT 3 B, 7 C FROM DUAL
    UNION ALL
    SELECT 2 B, 6 C FROM DUAL
    UNION ALL
    SELECT 4 B, 4 C FROM DUAL
    UNION ALL
    SELECT 1 B, 5 C FROM DUAL
    UNION ALL
    SELECT 2 B, 1 C FROM DUAL
)

C  DENSE_RANK()OVER(ORDERBYCDESC)

-------------------------------------------------------------------

9   1
9   1
7   2
6   3
5   4
4   5
1   6
0   7

 

아까 3등 먹었던 놈이 2등이 되었군요. 간단합니다.

RANK() OVER()는 순위를 매겨주되 공동 순위가 있을 경우 그만큼의 수를 넘어서 랭킹이 주어지고

DENSE_RANK() OVER()는 수를 넘지 않고 순서대로 랭킹을 주는 것입니다.

 

 

그렇다면 다른 한가지

만약 공동 순위를 주지 않고 같은 값일 지라도 순위를 매겨줄수 있는.. 즉, 공동 1등 두명에게 임의로 넌 1등 넌 2등 이라고

순위를 줘서 중복되는 순위없이 순위를 줄수 있는건 뭐가 있을까요?

그게 바로 ROW_NUMBER() OVER()입니다.

 

같은 값을 가진 두개의 데이타가 있다고 가정할때 공동 1등을 주는것이 아니라

한놈은 1등하고 한놈은 미안하지만 2등해라 라고 하는겁니다. 결과를 보시면 이해가 빠르실겁니다.

 

SELECT C, ROW_NUMBER () OVER(ORDER BY C DESC)
FROM (   
    SELECT 1 B, 0 C FROM DUAL
    UNION ALL
    SELECT 5 B, 9 C FROM DUAL
    UNION ALL
    SELECT 4 B, 9 C FROM DUAL
    UNION ALL
    SELECT 3 B, 7 C FROM DUAL
    UNION ALL
    SELECT 2 B, 6 C FROM DUAL
    UNION ALL
    SELECT 4 B, 4 C FROM DUAL
    UNION ALL
    SELECT 1 B, 5 C FROM DUAL
    UNION ALL
    SELECT 2 B, 1 C FROM DUAL
)

C   ROW_NUMBER()OVER(ORDERBYCDESC)

------------------------------------------------------------------------------

9   1
9   2
7   3
6   4
5   5
4   6
1   7
0   8

 

 

내용이 유용하셨다면 가시는길에 댓글한마디 부탁드립니다.

[본문링크] ORACLE - RANK() OVER() / DENSE_RANK() OVER / ROW_NUMBER () OVER()
[1]
코멘트(이글의 트랙백 주소:/cafe/tb_receive.php?no=31614
작성자
비밀번호

 

SSISOCommunity

[이전]

Copyright byCopyright ⓒ2005, SSISO Community All Rights Reserved.